有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVA中ArrayList<ArrayList>的深度副本

我检查了其他答案,但找不到正确的答案。 我想创建我的ArrayList<ArrayList>的副本,因为我需要在其他地方创建原始副本。我以不同的方式使用了.clone()方法:

public class WordChecker {

    private ArrayList<ArrayList> copyOfList = new ArrayList<ArrayList>();

    public WordChecker(ArrayList<ArrayList> list) {
        for (int i = 0; i < list.size(); i++)
            for (int j = 0; j < 7; j++)
                copyOfList = (ArrayList<ArrayList>) list.clone(); // without error
                // copyOfList = list.clone();cannot convert from Object to
                // ArrayList<ArrayList>
                // copyOfList = list.get(i).clone();cannot convert from Object to
                // ArrayList<ArrayList>
                // copyOfList = list.get(i).get(j).clone();
    }

但我的主要ArrayList仍然随着我对其副本的处理而改变。 有谁能告诉我,在这种情况下,我应该如何获得深度副本

回答: 我将复制机制放在我的类构造函数中:

private ArrayList<List> checkedTags = new ArrayList<List>();
public WordChecker(ArrayList<ArrayList> list)
  {
     for (ArrayList word: list) copyOfList.add((ArrayList) word.clone());

}

唯一的问题是,这不适用于从ArrayList复制,这让我经历了一个for循环使用。get()方法。我觉得他们最后基本上是一样的


共 (1) 个答案

  1. # 1 楼答案

    只需使用ArrayList(Collection c)构造函数即可

    public <T> ArrayList<ArrayList<T>> deepCopy(ArrayList<ArrayList<T>> source) {
        ArrayList<ArrayList<T>> dest = new ArrayList<ArrayList<T>>();
        for(ArrayList<T> innerList : source) {
            dest.add(new ArrayList<T>(innerList));
        }
        return dest;
    }
    

    注意事项: 正如@Tim B所提到的,这不会深度复制ArrayList中的元素